/* 
 * File:   FileServiceProxy.cpp
 * Author: nahuel
 * 
 * Created on May 24, 2013, 8:29 PM
 */

#include <sstream>
#include <string>
#include "client_FileServiceProxy.h"
#include "common_ProtocoloConstantes.h"
#include "common_Codec.h"

using namespace std;
using namespace TP;
using namespace TP::Servicios;

// TEST
#include "common_md5.h"

FileServiceProxy::FileServiceProxy(SocketAsincronico* pSocket) {
    this->_socket = pSocket;
}
FileServiceProxy::~FileServiceProxy() {
    _socket = NULL;
}

void FileServiceProxy::DeclareFile(const uint32_t &pToken, std::string& fileName) {
    try
    {
        std::stringstream strstm;
        strstm << pToken;

        string mensaje = strstm.str();
        mensaje += SEPARADOR_CAMPO;
        mensaje += FILE_SERVICE_NAME;
        mensaje += SEPARADOR_CAMPO;
        mensaje += FS_DECLARAR_ARCHIVO;
        mensaje += SEPARADOR_CAMPO;
        mensaje += fileName;
    
        _socket->Escribir(reinterpret_cast <const uint8_t*> (mensaje.c_str()), mensaje.length());
    }
    catch (Excepcion &ex)
    {
        cerr << endl << ex.what() << endl;
    }
}

bool FileServiceProxy::DefineFile(const uint32_t &pToken, std::string& fileName) {
    try
    {
        std::stringstream strstm;
        strstm << pToken;

        string mensaje = strstm.str();
        mensaje += SEPARADOR_CAMPO;
        mensaje += FILE_SERVICE_NAME;
        mensaje += SEPARADOR_CAMPO;
        mensaje += FS_DEFINIR_ARCHIVO;
        mensaje += SEPARADOR_CAMPO;
        mensaje += fileName;
    
        _socket->Escribir(reinterpret_cast <const uint8_t*> (mensaje.c_str()), mensaje.length());
    }
    catch (Excepcion &ex)
    {
        cerr << endl << ex.what() << endl;
    }
}

bool FileServiceProxy::PutFileChunk(const uint32_t &pToken, std::string& fileName, const uint32_t &pChunkNumber, const uint8_t* pChunk, const size_t pChunkSize) {

    try
    {
        // Se encodea el chunk.
        string strChunk = "";
        Codec codec;
        codec.codificar(strChunk,pChunk, pChunkSize);
        
        std::stringstream strstm;
        strstm << pToken;

        string mensaje = strstm.str();
        mensaje += SEPARADOR_CAMPO;
        mensaje += FILE_SERVICE_NAME;
        mensaje += SEPARADOR_CAMPO;
        mensaje += FS_PUT_CHUNK;
        mensaje += SEPARADOR_CAMPO;
        mensaje += fileName;
        mensaje += SEPARADOR_CAMPO;
        strstm.clear();
        strstm << pChunkNumber;
        mensaje += strstm.str();
        mensaje += SEPARADOR_CAMPO;
        mensaje += strChunk;
        
        _socket->Escribir((uint8_t*) mensaje.c_str(), mensaje.length());
    }
    catch (Excepcion &ex)
    {
        cerr << endl << ex.what() << endl;
    }
    
}




